package org.example.springmvc.controller;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.example.springmvc.bean.Person;
import org.springframework.http.HttpEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

@RestController
public class RequestTestController {
    /*
     *请求参数： username=2719251162%40qq.com&password=Qgzh200709017.%40&cellphone=1111&agreement=on
     * 要求：变量名和参数名保持一致
     * 1.没有携带：包装类型自动封装为null，基本类型封装为默认值
     * 2.携带：自动封装*/
    @RequestMapping("/handle01")
    public String test01(String username, String password, String cellphone, boolean agreement) {
        System.out.println(username);
        System.out.println(password);
        System.out.println(cellphone);
        System.out.println(agreement);
        return "ok";
    }

    /*
     * @RequestParam:取出某个参数的值，默认一定要携带，
     * 可以通过requires=false,使得非必须携带
     * 也可以通过defaultValue=默认值，使得非必须携带
     *
     * ps.无论请求参数带到了请求体还是url?后面，他们都是请求参数，都可以用@RequestParam或者用一个变量名获取到*/
    @RequestMapping("/handle02")
    public String test02(@RequestParam("username") String name, @RequestParam(value = "password", defaultValue = "123456") String pwd, @RequestParam("cellphone") String phone, @RequestParam(value = "agreement", required = false) boolean ok) {
        System.out.println(name);
        System.out.println(pwd);
        System.out.println(phone);
        System.out.println(ok);
        return "ok";
    }

    /*
     *请求体：username=zhangsan&password=111111&cellphone=1888888&agreement=on
     *
     * 如果目标方法参数是一个pojo(普通java类),SpringMVC会自动把请求参数和pojo属性进行匹配
     * 效果：
     *     1.pojo的所有属性都是来自于请求参数的
     *     2.如果请求参数没带，封装为null*/
    @RequestMapping("/handle03")
    public String test03(Person person) {
        System.out.println(person);
        return "ok";
    }

    @RequestMapping("/handle04")
    public String test04(@RequestHeader("host") String host, @RequestHeader("User-Agent") String ua) {//请求头不区分大小写
        System.out.println(host);
        System.out.println(ua);
        return "ok" + host;
    }

    /*
     * Cookie是由服务器发送给浏览器的特殊信息，浏览器会保存该信息，并在下次请求时携带发送给服务器。
     * 在Spring MVC中，可以通过@CookieValue注解来获取请求中特定的Cookie值。
     *
     * 用法示例：@CookieValue("cookieName") String cookieValue
     * 可以指定 defaultValue 属性来设置默认值，也可以通过 required=false 表示该Cookie可选。
     */
    @RequestMapping("/handle05")
    public String test05(@CookieValue("haha") String cookie) {
        System.out.println(cookie);
        return "ok" + cookie;
    }

    /*
     * 使用pojo级联封装复杂属性*/
    @RequestMapping("/handle06")
    public String test06(Person person) {
        System.out.println(person);
        return "ok";
    }

    /*
     * @RequestBody:将请求体中的数据（json），转为指定的类型（pojo）,实现自动化的反序列化
     * 测试：接收json数据
     * 1.发出：请求体中是json字符串，不是k=v
     * 2.接受：@RequestBody Person person
     *
     * @RequestBody Person person
     *       1.拿到请求体中的json字符串
     *       2.把json字符串转为person对象
     * */
    @RequestMapping("/handle07")
    public String test07(@RequestBody Person person) {
        System.out.println(person);
        return "ok";
    }

    /*
     * 测试：文件上传
     * @RequestParam:取出文件项
     * MultipartFile:专门封装文件项*/
    @RequestMapping("/handle08")
    public String test08(Person person,
                         @RequestParam("headerImg") MultipartFile headerImg,
                         @RequestParam("lifeImg") MultipartFile[] lifeImg) throws IOException {
        System.out.println(person);

        //1.获取原始文件名
        System.out.println("===========获取原始文件名=============");
        String originalFilename = headerImg.getOriginalFilename();
        System.out.println(originalFilename);
        for (MultipartFile file : lifeImg) {
            String originalFilename1 = file.getOriginalFilename();
            System.out.println(originalFilename1);
        }

        //2.文件大小
        System.out.println("===========获取文件大小=============");
        long size = headerImg.getSize();
        System.out.println(size);
        for (MultipartFile file : lifeImg) {
            long size1 = file.getSize();
            System.out.println(size1);
        }

        //3.获取文件流
        System.out.println("===========获取文件流=============");
        InputStream inputStream = headerImg.getInputStream();
        System.out.println(inputStream);
        for (MultipartFile file : lifeImg) {
            InputStream inputStream1 = file.getInputStream();
            System.out.println(inputStream1);
        }

        //4.保存文件
        System.out.println("===========保存文件=============");
        headerImg.transferTo(new File("D:\\testImg\\" + originalFilename));
        if (lifeImg.length > 0) {
            for (MultipartFile file : lifeImg) {
                file.transferTo(new File("D:\\testImg\\" + file.getOriginalFilename()));
            }
        }
        return "ok";
    }

    /*HttpEntity:封装请求头、请求体：把整个请求拿过来
     *   泛型：<String>:请求体类型：可以自动转化
     *   public class HttpEntity<T> {
         private final HttpHeaders headers;
         private final T body;
}
     * */
    @RequestMapping("/handle09")
    public String test09(HttpEntity<Person> httpEntity) {
        System.out.println("请求体：" + httpEntity.getBody());
        System.out.println("请求头" + httpEntity.getHeaders());//Map<String, String>
        return "ok";
    }

    /**
     * 处理路径为 "/handle10" 的请求
     * 使用 HttpServletRequest 获取请求中的参数，演示原生 API 的使用方式
     * @param request  HttpServletRequest 对象，用于获取客户端发送的请求数据
     * @param response HttpServletResponse 对象，用于向客户端发送响应数据
     * @return 返回字符串 "ok" + 获取到的用户名
     */
    @RequestMapping("/handle10")
    public String test10(HttpServletRequest request, HttpServletResponse response) {
        // 通过 request 对象获取名为 "user" 的请求参数
        String username = request.getParameter("user");
        // 打印获取到的用户名
        System.out.println(username);
        // 返回响应结果
        return "ok" + username;
    }


}